package com.itheima.weirpc.proxy;

import io.etcd.jetcd.api.User;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * ClassName: MockServiceProxy
 * Package: com.itheima.weirpc.proxy
 * Description:
 * 在Proxy包下新增MockServiceProxy类，用于生成mock代理服务。
 * 在这个类中，需要提供一个根据服务接口类型返回固定值的方法
 * 通过getDefaultobject方法，根据代理接口的class返回不同的默认值，比如针对boolean类型返回false、对象类型返回null等
 *
 * @Author 看到风
 * @Create 2024/11/23 19:54
 * @Version 1.0
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {
    /**
     * 调用代理
     *
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 根据方法的返回值类型，生成特定的默认值对象
        Class<?> methodReturnType = method.getReturnType();
        log.info("mock invoke {}", method.getName());
        return getDefaultObject(methodReturnType);
    }

    /**
     * 生成指定类型的默认值对象（可自行完善默认值逻辑）
     *
     * @param type
     * @return
     */
    private Object getDefaultObject(Class<?> type) {

        // 基本类型
        if (type.isPrimitive()) {
            if (type == boolean.class) {
                return false;
            } else if (type == short.class) {
                return (short) 0;
            } else if (type == int.class) {
                return 0;
            } else if (type == long.class) {
                return 0L;
            }
//            可以考虑使用 Map<Class<?>, Object> 来存储每个类型对应的默认实例


        }
        // 对象类型
        return null;
    }

}
